package com.edev.support.web;

import com.edev.support.entity.ResultSet;
import com.edev.support.query.QueryService;
import com.edev.support.utils.SpringHelper;
import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * 通用查询控制器（支持GET/POST请求）
 * <p>
 * 代码示例：
 * <pre>
 * 1. 在Spring容器中注册了名为userQry的查询服务：
 * curl -X POST http://localhost:8080/query/userQry \
 * -H "Content-Type: application/json" \
 * -d '{"gender": "Male", "size": 20}'
 * 2. 在Spring容器中注册了名为userQry的查询服务：
 * curl http://localhost:8080/query/userQry?gender=Male&size=20
 * </pre>
 * <p>
 * 核心功能：
 * 1. 动态调用Spring容器中的QueryService实现
 * 2. 自动合并GET/POST请求参数
 * 3. 统一返回ResultSet格式结果
 * <p>
 * 典型使用场景：
 * - 前端通用查询接口
 * - 动态报表数据获取
 * - 复杂查询服务暴露
 * @author fangang
 */
@RestController
public class QueryController extends AbstractController {
    @Autowired
    private SpringHelper springHelper;

    /**
     * 通用查询入口方法（支持GET/POST）
     * @param beanName Spring容器中的QueryService Bean名称
     * @param map POST请求的JSON参数（可为空）
     * @param request GET请求的HttpServletRequest对象
     * @return 标准化查询结果集
     */
    @RequestMapping(value = "query/{bean}", method = {RequestMethod.GET, RequestMethod.POST})
    public ResultSet query(@PathVariable("bean") String beanName,
                           @RequestBody(required = false)Map<String, Object> map,
                           HttpServletRequest request) {
        QueryService service = (QueryService) springHelper.getService(beanName);
        Map<String, Object> json = mergeDataToJson(map, request);
        return service.query(json);
    }

    /**
     * POST方式查询（参数通过请求体传递）
     * @param beanName QueryService Bean名称
     * @param params 查询参数Map
     * @return 标准化查询结果集
     */
    public ResultSet queryByPost(@NonNull String beanName, Map<String, Object> params) {
        return query(beanName, params, null);
    }

    /**
     * GET方式查询（参数通过URL传递）
     * @param beanName QueryService Bean名称
     * @param request HTTP请求对象
     * @return 标准化查询结果集
     */
    public ResultSet queryByGet(@NonNull String beanName, @NonNull HttpServletRequest request) {
        return query(beanName, null, request);
    }
}
